package com.zhj.rabbitmq.com.config;

import com.zhj.rabbitmq.com.common.RabbitmqUtils;
import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @program: rabbimmq-demo
 * @description:
 * @author: zhengjibin
 * @create: 2020-11-19 14:34
 * @Version 1.0
 **/
@Configuration
public class RabbitmqConfig {
    /**************************************direct 类型交换机和队列绑定***************************************************/
    /**
     * 创建交换机 direct类型交换机 ：
     * 注意Exchange 需要引 org.springframework.amqp.core.DirectExchange
     * DirectExchange是一个接口，有direct,fanout,topic,handers等多种 类型的Exchange实现
     */
    @Bean
    public DirectExchange directExchange(){
        //DirectExchange();有多种构造方法,参数1：交换机名称，参数2：是否持久化，参数3：是否自动删除，参数4：交换机属性信息
        // DirectExchange(String name, boolean durable, boolean autoDelete, Map<String, Object> arguments)
        return new DirectExchange(RabbitmqUtils.directExchangeName);
    }

    /**
     *创建队列 direct类型交换机绑定，
     */
    @Bean("directRabbitmqQueue")
    public Queue directRabbitmqQueue(){

        return new Queue(RabbitmqUtils.directQueueName);
    }

    /**
     * 创建一个binding，绑定队列和交换机
     * @param directRabbitmqQueue 需要绑定到交换机的队列对象。参数名必须与创建队列名的Bean对象一样（就是方法名）
     * @param directExchange 需要绑定的交换机对象 .注意这的DirectExchange 不能使用父类的Exchange 否则BindingBuilder.bind()方法不能返回Binding对象
     * @return
     */
    @Bean
    public Binding setExchangeQueueBinding(@Qualifier("directRabbitmqQueue") Queue directRabbitmqQueue,@Qualifier("directExchange") DirectExchange directExchange){
        //这个方法，参数1：传入一个队列，将队列绑定到交换机。如果传入一个交换机就将交换机绑定到另一个交换机
        //参数2：交换机
        //参数3：routingkey，因为是direct的交换机，所以必须指定routingkey
        return BindingBuilder.bind(directRabbitmqQueue).to(directExchange).with(RabbitmqUtils.directBootRoutingkey);
    }
    //////////////////////////////////结束

    /***************************fanout类型交换机创建********************************/
    @Bean
    public FanoutExchange fanoutExchange(){
        //DirectExchange();有多种构造方法,参数1：交换机名称，参数2：是否持久化，参数3：是否自动删除，参数4：交换机属性信息
        // DirectExchange(String name, boolean durable, boolean autoDelete, Map<String, Object> arguments)
        return new FanoutExchange(RabbitmqUtils.fanoutExchangeName);
    }

    //////////////////////////////////////结束



    /***************************topic类型交换机创建********************************/
    @Bean
    public TopicExchange topicExchange(){
        //DirectExchange();有多种构造方法,参数1：交换机名称，参数2：是否持久化，参数3：是否自动删除，参数4：交换机属性信息
        // DirectExchange(String name, boolean durable, boolean autoDelete, Map<String, Object> arguments)
        return new TopicExchange(RabbitmqUtils.topicExchangeName);
    }

    //////////////////////////////////////结束
}
